package com.zenithmind.coding.pojo.entity;

import com.baomidou.mybatisplus.annotation.TableName;
import com.zenithmind.common.base.BaseEntity;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.time.LocalDateTime;
import java.util.Objects;

/**
 * 编程问题审核信息实体类 - 遵循单一职责原则，专门处理问题的审核相关信息
 * 
 * @author ZenithMind Team
 * @since 2025-01-09
 */
@Data
@EqualsAndHashCode(callSuper = true, onlyExplicitlyIncluded = true)
@TableName("coding_problem_review")
@Schema(description = "编程问题审核信息实体")
public class ProblemReview extends BaseEntity {

    /**
     * 问题ID
     */
    @Schema(description = "问题ID")
    @EqualsAndHashCode.Include
    private String problemId;

    /**
     * 审核者ID
     */
    @Schema(description = "审核者ID")
    private String reviewerId;

    /**
     * 审核者名称
     */
    @Schema(description = "审核者名称")
    private String reviewerName;

    /**
     * 审核状态（0-待审核，1-审核通过，2-审核拒绝，3-需要修改）
     */
    @Schema(description = "审核状态（0-待审核，1-审核通过，2-审核拒绝，3-需要修改）")
    private Integer reviewStatus;

    /**
     * 审核意见
     */
    @Schema(description = "审核意见")
    private String reviewComment;

    /**
     * 审核时间
     */
    @Schema(description = "审核时间")
    private LocalDateTime reviewTime;

    /**
     * 审核版本号
     */
    @Schema(description = "审核版本号")
    private Integer reviewVersion;

    /**
     * 审核类型（1-首次审核，2-修改后审核，3-申诉审核）
     */
    @Schema(description = "审核类型（1-首次审核，2-修改后审核，3-申诉审核）")
    private Integer reviewType;

    /**
     * 审核优先级（1-低，2-中，3-高，4-紧急）
     */
    @Schema(description = "审核优先级（1-低，2-中，3-高，4-紧急）")
    private Integer priority;

    /**
     * 审核标签（JSON格式）
     */
    @Schema(description = "审核标签（JSON格式）")
    private String reviewTags;

    /**
     * 质量评分（1-5分）
     */
    @Schema(description = "质量评分（1-5分）")
    private Integer qualityScore;

    /**
     * 难度评估（1-5分）
     */
    @Schema(description = "难度评估（1-5分）")
    private Integer difficultyAssessment;

    /**
     * 创新性评分（1-5分）
     */
    @Schema(description = "创新性评分（1-5分）")
    private Integer innovationScore;

    /**
     * 实用性评分（1-5分）
     */
    @Schema(description = "实用性评分（1-5分）")
    private Integer practicalityScore;

    /**
     * 是否推荐发布（0-否，1-是）
     */
    @Schema(description = "是否推荐发布（0-否，1-是）")
    private Integer recommendPublish;

    /**
     * 建议修改内容
     */
    @Schema(description = "建议修改内容")
    private String suggestedChanges;

    /**
     * 审核附件（JSON格式）
     */
    @Schema(description = "审核附件（JSON格式）")
    private String attachments;

    /**
     * 重写equals方法以确保里氏替换原则
     */
    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (obj == null || getClass() != obj.getClass()) return false;
        if (!super.equals(obj)) return false;
        
        ProblemReview that = (ProblemReview) obj;
        return Objects.equals(problemId, that.problemId) &&
               Objects.equals(reviewVersion, that.reviewVersion);
    }

    /**
     * 重写hashCode方法以确保里氏替换原则
     */
    @Override
    public int hashCode() {
        return Objects.hash(super.hashCode(), problemId, reviewVersion);
    }

    /**
     * 检查是否审核通过
     */
    public boolean isApproved() {
        return Integer.valueOf(1).equals(this.reviewStatus);
    }

    /**
     * 检查是否审核拒绝
     */
    public boolean isRejected() {
        return Integer.valueOf(2).equals(this.reviewStatus);
    }

    /**
     * 检查是否需要修改
     */
    public boolean needsModification() {
        return Integer.valueOf(3).equals(this.reviewStatus);
    }

    /**
     * 计算综合评分
     */
    public Double calculateOverallScore() {
        if (qualityScore == null || difficultyAssessment == null || 
            innovationScore == null || practicalityScore == null) {
            return null;
        }
        
        // 权重：质量40%，难度20%，创新性20%，实用性20%
        return (qualityScore * 0.4 + difficultyAssessment * 0.2 + 
                innovationScore * 0.2 + practicalityScore * 0.2);
    }
}
